/*
 * linha.c
 *
 *  Created on: 31/05/2011
 *      Author: fernando
 */

#include <stdlib.h>
#include <string.h>
#include "linha.h"

#include <stdio.h>

Linha *novaLinha(int num, char *linha) {
	Linha *l;
	l = (Linha *) malloc(sizeof(Linha));
	l->num = num;
	l->cont = (char *) malloc(sizeof(char) * (strlen(linha) + 1));
	strcpy(l->cont, linha);
	return l;
}

void setConteudoLinha(Linha *l, char *cont) {
	strcpy(l->cont, cont);
}

void inicializaNoLinha(NoLinha **l) {
	*l = NULL;
}

/*insere no fim*/
void insereNoLinha(Linha *linha, NoLinha **l) {
	NoLinha *p, *aux;

	aux = (NoLinha *) malloc(sizeof(NoLinha));
	aux->prox = NULL;
	aux->l = linha;

	if(*l == NULL)
		*l = aux;
	else {
		p = *l;
		while(p->prox != NULL)
			p = p->prox;
		p->prox = aux;
	}
}


void removeLinhas(Linha *linha, NoLinha **l) {
	NoLinha *p;
	NoLinha *aux;

	while((*l) != NULL && (*l)->l == linha) {
		aux = (*l);
		(*l) = (*l)->prox;
		free(aux);
	}

	if(*l == NULL)
		return;

	p = *l;

	while(p->prox != NULL) {
		while(p->prox->l == linha) {
			aux = p->prox;
			p->prox = aux->prox;
			free(aux);
		}
		p = p->prox;
	}

}

void removeNoLinha(NoLinha *p, NoLinha **linhas) {
	NoLinha *aux, *p1;

	if(p == *linhas) {
		aux = *linhas;
		*linhas = aux->prox;
		free(aux);
		return;
	}

	p1 = *linhas;

	while(p1 != NULL) {
		if(p1->prox == p) {
			p1->prox = p->prox;
			aux = p;
			free(aux);
			return;
		}
		p1 = p1->prox;
	}
}

void removeDuplicatasLinhas(NoLinha **l) {
	NoLinha *p;

	if(*l == NULL)
		return;

	p = *l;

	while(p->prox != NULL) {
		removeLinhas(p->l, &(p->prox));
		if(p->prox == NULL)
			break;
		p = p->prox;
	}
}

NoLinha *buscaLinha(Linha *l, NoLinha *linhas) {
	NoLinha *p;

	p = linhas;

	while(p != NULL) {
		if(p->l == l)
			return p;
		p = p->prox;
	}

	return NULL;
}

void intersecaoLinhas(NoLinha **a, NoLinha *b) {
	NoLinha *pA;

	pA = *a;

	while(pA != NULL) {
		if(buscaLinha(pA->l, b) == NULL)
			removeNoLinha(pA, a);

		pA = pA->prox;
	}
}

void menosLinhas(NoLinha **a, NoLinha *b) {
	NoLinha *pA;

	pA = *a;

	while(pA != NULL) {
		if(buscaLinha(pA->l, b) != NULL)
			removeNoLinha(pA, a);
		else
			pA = pA->prox;
	}
}
